#include "../server.hpp"

class EchoServer
{
private:
    TcpServer _server;

private:
    // 下面这个函数在这个回显服务器中的功能是：这是TcpServer主线程执行的有广播给其它所有client的意思
    void OnConnected(const PtrConnection &conn)
    {
        DBG_LOG("从属线程广播任务: 执行线程id: %p, a new connection: %p", std::this_thread::get_id(), conn.get());
        // DBG_LOG("执行线程id: %p, a new connection: %p", std::pthread_self(), conn.get());  // error
    }
    void OnClosed(const PtrConnection &conn)
    {
        DBG_LOG("从属线程:%p, 关闭连接: CLOSE CONNECTED: %p", std::this_thread::get_id(), conn.get());
    }
    // client发送过来的请求信息，黑我们接收到了用户缓冲区Buffer里了，再传递给我们的server处理。收到什么发送什么
    void OnMessage(const PtrConnection &conn, Buffer *buf)
    {
        // 这里进行server的业务处理。我们这个是一个回显服务器，所以只是把接收到的数据再发送回去(回显)
        DBG_LOG("接收client发来的信息为: %s, 接收线程为: %p", buf->ReadPosition(), std::this_thread::get_id());
        // conn->Send(buf->ReadPosition(), buf->ReadAbleSize());

        // 下面这样的发送是有问题的
        // char *s = " ";
        // sprintf(s, "执行线程id: %p, client->server: hello server\n", std::this_thread::get_id());
        // conn->Send(s, strlen(s));

        // 自己再组织信息发送回去
        std::string str = "server->client: hello client";
        conn->Send(str.c_str(), str.size());
        DBG_LOG("从属线程发送任务: 执行线程id: %p\n", std::this_thread::get_id());

        buf->MoveReadOffset(buf->ReadAbleSize());
        // conn->Shutdown();  // 测试接收一次数据就断开连接
    }

public:
    EchoServer(int port) : _server(port)
    {
        _server.SetThreadCount(2);
        // _server.EnableInactiveCallback(5);
        _server.SetClosedCallback(std::bind(&EchoServer::OnClosed, this, std::placeholders::_1));
        _server.SetConnectedCallback(std::bind(&EchoServer::OnConnected, this, std::placeholders::_1));
        _server.SetMessageCallback(std::bind(&EchoServer::OnMessage, this, std::placeholders::_1, std::placeholders::_2));
    }
    void Start() { _server.Start(); }
};
